package com.yc.springmvc.controller;

import com.yc.springmvc.bean.Person;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//@Controller
@RestController    //HTml + JSON

//控制返回值 1. json 2. 返回页面

//RestController 默认每个方法的返回值自动转为json

public class IndexController {

    @RequestMapping("*hello")
    String hello(String name){
        return "hello" + name;

    }

    @RequestMapping("toPage")
    ModelAndView toPage(String page){
        page = page == null ? "A":page;
        ModelAndView mav = new ModelAndView();
        //redirect 响应重定向  forward 请求转发
        mav.setViewName("redirect:" + page +".html");
        return mav;
    }
    @RequestMapping(path={"test","testA","testB"})
    String test(){
        return "test";
    }


    //path = "method": 指定了处理请求的路径为 "/method"。
    // 即当客户端发送请求到 "/method" 路径时，将会调用这个方法。
    @RequestMapping( path = "method",  //为什么405   因为只有当客户端发送POST或HEAD请求时，才会调用这个方法
               method = {RequestMethod.POST,RequestMethod.HEAD} )
    //method = {RequestMethod.POST, RequestMethod.HEAD}:
    // 指定了该方法可以处理的HTTP请求方法，包括POST和HEAD。
    // 这意味着只有当客户端发送POST或HEAD请求时，才会调用这个方法。
    String method(){
        return "method";
    }

    @GetMapping(path = "myname",
                params = "name!=john",   // 400    对请求参数进行限制
                headers = "Host=localhost:8088")  //404
    String myname(String name){
        return "myname" + name;
    }

    @PostMapping(path = "upload",

                consumes = MediaType.MULTIPART_FORM_DATA_VALUE,  // 指定了这个方法接受的请求类型为multipart/form-data，即支持文件上传
                produces = MediaType.TEXT_HTML_VALUE+";charset = utf-8")  //: 指定了这个方法产生的响应类型为text/html;charset=utf-8，
                                                                        // 即返回的内容类型为HTML格式，并指定了编码为UTF-8。
    String upload(){
        return "文件上传";
    }

    //////////////////////////////////////////////

    @RequestMapping("add")
    int add(@RequestParam("x") int a,  //表示从请求参数中获取名为"x"的参数，并将其转换为整数赋值给变量a
            @RequestParam(name = "y", // 表示从请求参数中获取名为"y"的参数。
                defaultValue = "100",//如果请求中没有提供"y"参数，则使用默认值100
                required = false ) int b){   // 表示"y"参数不是必需的，可以不提供
        return a+ b;
    }

    @RequestMapping("person1")
    Person person1(Person p){
        return p;
    }

    @RequestMapping("person2")
    Person person2(@RequestBody Person p){  //表示将请求的主体（body）部分映射到Person对象p上。
        return p;

    }

    @RequestMapping("servlet")
    String servlet(

            HttpServletRequest request,
            HttpServletResponse response,
            HttpSession session
    ){

        return request + " = "+
                response + " = "+
                session + " =  ";


    }








}
